package cn.zyjblogs.netty.dubborpc.netty;


import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable<String> {
    /**
     * 上下文
     */
    private ChannelHandlerContext context;
    /**
     * 返回结果
     */
    private String result;
    /**
     * 客户端调用方法时 传入的结果
     */
    private String param;

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //会在其他方法使用上下文
        context = ctx;
    }

    /**
     *  接收到服务器的数据后，调用方法
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        result = msg.toString();
        //唤醒等待的线程
        notify();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    /**
     * 被代理对象调用，发送数据给服务器，等待被唤醒（channelRead） -> 返回结果
     * @return
     * @throws Exception
     */
    @Override
    public  synchronized String call() throws Exception {
        context.writeAndFlush(param);
        //进行wait
        wait();
        return result;
    }

    public void setParam(String param) {
        this.param = param;
    }
}
